﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Xml;

namespace CEP
{
    /// <summary>
    /// Esta classe é responsável por gerir as notificações via SMS
    /// </summary>
    class NotificarSMS
    {

        private static NotificarSMS instance = new NotificarSMS();
        private NotificarSMS() { }

        public static NotificarSMS Instance
        {
            get
            {
                return instance;
            }
        }


        /// <summary>
        /// Envia um SMS para notificar o utilizador
        /// </summary>
        /// <param name="evento">O modelo do evento a ser enviado</param>
        /// <returns>True se enviado com sucesso</returns>
        public bool enviar(Evento evento)
        {

            //definir mensagem a ser enviado via SMS
            string message = string.Format(@"Ola {0}%0ANao se esqueca do seu evento '{1}' ja no proximo dia {2}%0AMais informacoes visite o nosso site.", evento.visitante_nome, evento.titulo, String.Format("{0:dd/MM}", evento.data_inicio));

            //definir RESTful url com os parãmetros a serem enviados
            string url = string.Format("http://rest.nexmo.com/sms/xml?username={0}&password={1}&from={2}&to={3}&text={4}", Properties.Settings.Default.nexmo_key, Properties.Settings.Default.nexmo_secret, "ExtremEvent", evento.visitante_telefone, message);

            Log.Instance.escrever(String.Format("Notificar | SMS | ID Evento:{0}, ID Subscricao:{1}, Para:{2}, URL:{3}", evento.id_evento, evento.id_subscrever_evento, evento.visitante_telefone, url));

            try
            {

                //criar pedido
                HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest;

                string result = null;

                //obter resposta
                using (HttpWebResponse resp = req.GetResponse() as HttpWebResponse)
                {
                    StreamReader reader = new StreamReader(resp.GetResponseStream());
                    result = reader.ReadToEnd();

                    using (XmlReader xmlreader = XmlReader.Create(new StringReader(result)))
                    {

                        //obter estado
                        xmlreader.ReadToFollowing("status");
                        int status = Int32.Parse(xmlreader.ReadElementContentAsString());

                        //verifica se foi enviado com sucesso (status = 0)
                        if (status == 0)
                        {
                            return true;
                        }
                        else
                        {
                            //obter mensagem
                            xmlreader.ReadToFollowing("errorText");
                            string errorText = xmlreader.ReadElementContentAsString();

                            Log.Instance.escrever(String.Format("Error: Erro nexmo id:{0} | {1}", status, errorText));
                            return false;
                        }

                    }
                }

            }
            catch (Exception e)
            {
                Log.Instance.escrever("Error: Ocorreu um erro a enviar o sms\n" + e.Message + "\n" + e.ToString());

                return false;
            }
        }
    }

}
